package com.iwhalecloud.citybrain.flow.platform.api;

import com.iwhalecloud.citybrain.flow.platform.api.in.*;
import com.iwhalecloud.citybrain.flow.platform.api.out.*;
import com.iwhalecloud.citybrain.flow.platform.manager.common.ResponseResult;
import com.iwhalecloud.citybrain.flow.platform.api.out.TaskCandidateResultDto;
import com.iwhalecloud.citybrain.flow.platform.manager.common.client.*;
import io.swagger.annotations.ApiOperation;

import java.util.List;

/**
 * @author lilh
 * @date 2020/10/29 16:50
 */
public interface FlowClientService {

    /**
     * 创建流程实例
     *
     * @param createProcessInstanceDto 流程模型相关参数
     * @return 结果
     */
    ResponseResult createProcessInstance(HttpCreateProcessInstanceDto createProcessInstanceDto);

    /**
     * 启动流程实例
     *
     * @param startProcessInstanceDto 流程实例id等信息
     * @return 结果
     */
    ResponseResult startProcessInstance(HttpStartProcessInstanceDto startProcessInstanceDto);

    /**
     * 发起流程
     *
     * @param applyProcessDto 发起流程参数
     * @return 结果
     */
    ResponseResult applyProcess(HttpApplyProcessDto applyProcessDto);

    /**
     * 获取流程基本信息
     * @param httpCommandDto 需要填流程实例编号
     * @return 流程基本信息
     */
    ResponseResult processInstance(HttpCommandDto httpCommandDto);

    /**
     * 完成工作项(办理任务)
     *
     * @param completeWorkItemDto 工作项id等信息
     * @return 处理结果
     */
    ResponseResult completeWorkItem(HttpCompleteWorkItemDto completeWorkItemDto);


    /**
     * 转办工单
     *
     * @param dispatchWorkItemDto 工单及被转办人信息
     * @return 转办结果
     */
    ResponseResult dispatchWorkItem(HttpDispatchWorkItemDto dispatchWorkItemDto);


    /**
     * 转办工单，不校验处理人是否是当前任务的候选人
     * @param dispatchWorkItemDto
     * @return
     */
    ResponseResult dispatchWorkItemNonUserCheck(HttpDispatchWorkItemDto dispatchWorkItemDto);


    /**
     * 终止流程(结束流程)
     *
     * 谁都可以终止
     * @param httpTerminateProcessInstanceDto 实例id等参数
     * @return 结果
     */
    ResponseResult terminateProcessInstance(HttpTerminateProcessInstanceDto httpTerminateProcessInstanceDto);


    /**
     * 撤销流程(结束流程)，针对流程发起人
     * @param httpCancelProcessInstanceDto
     * @return
     */
    ResponseResult cancelProcessInstance(HttpCancelProcessInstanceDto httpCancelProcessInstanceDto);


    /**
     * 查询任务列表
     *
     * @param taskListQueryDto 任务列表查询
     * @return 任务列表
     */
    ResponseResult listTask(HttpTaskListQueryDto taskListQueryDto);

    /**
     * 我的申请列表
     *
     * @param myApplyQueryDto 申请列表查询条件
     * @return 申请列表
     */
    ResponseResult listMyApply(HttpMyApplyQueryDto myApplyQueryDto);

    /**
     * 获取模型关联的表单信息
     *
     * @param modelKey 模型key
     * @return 启动表单的schema
     */
    ResponseResult getStartForm(String modelKey);

    /**
     * 获取启动时提交的表单数据
     *
     * @param processInstanceId 流程实例id
     * @return 启动表单schema+表单数据
     */
    ResponseResult getStartFormWithData(String processInstanceId);

    /**
     * 获取任务关联的表单
     *
     * @param taskId 任务id
     * @return 任务表单的schema
     */
    ResponseResult getTaskForm(String taskId);

    /**
     * 获取任务关联的表单schema及数据
     *
     * @param taskId 任务id
     * @return 任务表单的schema和数据
     */
    ResponseResult getTaskFormDataByTaskId(String taskId);


    /**
     * 根据流程实例编号获取当前任务编号
     * @param processInstanceId
     * @return
     */
    ResponseResult<TaskDTO> getCurrentTaskIdByProcessInstanceId(String processInstanceId);

    /**
     * 获取流程流转记录
     *
     * @param processInstanceId 实例id
     * @return 流转记录
     */
    ResponseResult getFlowRecords(String processInstanceId);


    /**
     * 获取模型列表
     *
     * @param appCode 应用编码
     * @return 模型列表
     */
    ResponseResult getModels(String appCode);

    /**
     * 获取任务关联的表单数据
     *
     * @param processInstanceId 实例id
     * @param taskNodeCode      任务节点编码
     * @return 表单数据
     */
    ResponseResult getTaskFormWithData(String processInstanceId, String taskNodeCode);

    /**
     * 生成流程图
     *
     * @param processGraphDto 实例信息
     * @return 流程图
     */
    ResponseResult<HttpProcessGraphResponseDto> generateProcessDiagram(HttpGetProcessGraphDto processGraphDto);

    /**
     * 生成流程图定义文件xml
     *
     * @param processXmlDto 实例信息
     * @return 流程图xml
     */
    ResponseResult<HttpProcessXmlResponseDto> generateProcessXml(HttpGetProcessXmlDto processXmlDto);


    public ResponseResult selectEmployeeList(EmployeeQueryDto vo);


    public ResponseResult getProcessInstanceDiagramAndInfo(String processInstanceId);

    void  drawInst(String  procInstId);

    /**
     * 阅知列表  此任务实例被别人完成了。
     * @param flowTaskFinishedNoticeQueryDto
     * @return
     */
    ResponseResult   selectYuezhiTaskList(FlowTaskFinishedNoticeQueryDto flowTaskFinishedNoticeQueryDto);

    ResponseResult   getTaskInst(String taskId,  String userId);

    ResponseResult   todoTaskupdateReadFlag(UpdateReadVo updateReadVo);


    /**
     * 根据流程实例ID或者任务实例ID查询字段权限
     * @param flowFieldLimitQueryVo 流程字段限制查询接口
     * @return
     */
    ResponseResult<List<FlowFieldLimitDTO>> getFormFieldLimitList(FlowFieldLimitQueryVo flowFieldLimitQueryVo);
    /**
     * 获取阅办信息列表
     *
     * 条件:阅办处理人ID列表
     *
     * @param processInstanceHandleRelDto
     * @return
     */
    ResponseResult getReadDoList(HttpProcessInstanceHandleRelDto processInstanceHandleRelDto);

    /**
     * 更新阅办状态
     *
     * 条件：阅办处理人ID&流程实例ID或任务实例ID
     *
     * @param processInstanceHandleRelDto
     * @return
     */
    ResponseResult updateReadDoStatus(HttpProcessInstanceHandleRelDto processInstanceHandleRelDto);

    /**
     * 获取用户组集合列表
     *
     * @return
     */
    ResponseResult getUserGroupList();

    /**
     * 获取用户岗位列表
     *
     * @return
     */
    ResponseResult getAllPositionList();

    /**
     * 获取用户关系列表
     * @return
     */
    ResponseResult getUserRelationShipList();


    /**
     * 根据任务实例编号获取审批页面
     * @param taskApproveUrlQueryVo
     * @return
     */
    ResponseResult<TaskUrlDTO> getTaskApproveUrl(TaskApproveUrlQueryVo taskApproveUrlQueryVo);


    /**
     * 回退
     * 可回退到上一节点
     * 可回退到指定节点
     * @param taskRollbackDto
     * @return
     */
    ResponseResult rollbackToPreNode(HttpTaskRollbackDto taskRollbackDto);

    /**
     * 回退到第一个审批节点
     * @param taskRollbackDto
     * @return
     */
    ResponseResult rollbackToFirstNode(HttpTaskRollbackDto taskRollbackDto);


    /**
     * 回退到给定节点
     * @param taskRollbackDto
     * @return
     */
    ResponseResult rollbackToTargetNode(HttpTaskRollbackDto taskRollbackDto);


    /**
     * 添加自定义函数配置
     *
     * @param functionConfigDto
     * @return
     */
    ResponseResult saveFunctionConfig(HttpFunctionConfigDto functionConfigDto);

    /**
     * 删除自定义函数配置
     *
     * @param ids
     * @return
     */
    ResponseResult deleteFunctionConfig(String ids);

    /**
     * 根据函数名称获取自定义函数配置列表
     *
     * @param functionConfigDto
     * @return
     */
    ResponseResult getFunctionConfigByFunName(HttpFunctionConfigDto functionConfigDto);

    /**
     * 判断当前用户是否为当前任务的候选人
     * 如果是的话，返回当前节点配置的菜单按钮
     * @param taskCandidateCheckVo
     * @return
     */
    ResponseResult<TaskCandidateResultDto> queryCandidateTask(TaskCandidateCheckVo taskCandidateCheckVo);

    /**
     * 根据流程实例或任务实例以及人员id处理对应的阅办信息
     *
     * @param processInstanceHandleRelDto
     * @return
     */
    ResponseResult dealReadDoData(HttpProcessInstanceHandleRelDto processInstanceHandleRelDto);

    /**
     * 判断是否必须表达意见
     * @param taskApproveUrlQueryVo
     * @return
     */
    ResponseResult<MustExpressDTO> mustExpress(TaskApproveUrlQueryVo taskApproveUrlQueryVo);


    /**
     * 委派或指派任务
     *
     * @param httpDelegateTaskDto
     * @return
     */
    ResponseResult delegateTask(HttpDelegateTaskDto httpDelegateTaskDto);

    /**
     * 加签或多级加签任务
     *
     * @param httpAddSignTaskDto
     * @return
     */
    ResponseResult addSignTask(HttpAddSignTaskDto httpAddSignTaskDto);

    /**
     * 任务减签
     *
     * @param httpDeleteSignTaskDto
     * @return
     */
    ResponseResult deleteSignTask(HttpDeleteSignTaskDto httpDeleteSignTaskDto);

    /**
     * 查询与流程相关的对象类型
     * @param objectMetaQueryDto
     * @return
     */
    ResponseResult<List<ObjectMetaDto>> queryObjectMeta(ObjectMetaQueryDto objectMetaQueryDto);

    /**
     * 根据对象ID绑定实例ID或任务节点编码
     * @param objectProcessInstanceVo
     * @return
     */
    ResponseResult bindObjectIdWithTask(ObjectProcessInstanceVo objectProcessInstanceVo);

    /**
     * 根据对象实例ID获取该实例ID关联的实例ID集合列表
     * @param objectProcessInstanceVo
     * @return
     */
    ResponseResult<List<ObjectProcessInstanceVo>> getObjectProcessInstanceList(ObjectProcessInstanceVo objectProcessInstanceVo);

    /**
     * 设置任务变量，注意该变量设置可能会影响全局变量
     * @param requestDto
     * @return
     */
    ResponseResult<TaskVariableSetResponseDto> setTaskVariable(TaskVariableSetRequestDto requestDto);

    /**
     * 设置任务变量，注意该变量设置可能会影响全局变量
     * @param requestDto
     * @return
     */
    ResponseResult<TaskVariablesSetResponseDto> setTaskVariables(TaskVariablesSetRequestDto requestDto);


    /**
     * 设置后续节点的处理人
     * @param setNodeCandidateRequestDto
     * @return
     */
    ResponseResult setAssigneeForNode(SetNodeCandidateRequestDto setNodeCandidateRequestDto);


    /**
     * 拿回
     * @param taskTakeBackDto
     * @return
     */
    ResponseResult takeBack(HttpTaskTakeBackDto taskTakeBackDto);

    /**
     * 根据任务ID获取下一节点处理人信息
     * @param taskId
     * @return
     */
    ResponseResult getNextNodeHandlerTask(String taskId);


    /**
     * 根据taskId获取后续节点的处理人配置信息
     * 仅限顺序流程使用，不适用于有网关往回指的情况
     * @param sequentNodeCandidateConfigRequestDto
     * @return
     */
    ResponseResult getSequentNodeCandidateConfig(SequentNodeCandidateConfigRequestDto sequentNodeCandidateConfigRequestDto);

    /**
     * 根据实例ID和节点编码获取节点候选人对象
     * @param processInstanceId
     * @param nodeCode
     * @return
     */
    ResponseResult getNodeCandidateInfoList(String processInstanceId, String nodeCode);

    /**
     * 获取上次设置的候选人
     *
     * @param taskId
     * @param nodeCode
     * @return
     */
    ResponseResult getLastCandidate(String taskId, String nodeCode);

    /**
     * 获取所有节点上次设置的候选人
     *
     * @param processInstanceId
     * @return
     */
    ResponseResult getAllLastCandidate(String processInstanceId);

    /**
     * 获取指定节点最新设置的候选人或者最近审批人信息
     * @param processInstanceId
     * @param nodeCode
     * @return
     */
    ResponseResult getLastCandidateOrOperator (String processInstanceId,String nodeCode);

    /**
     * 根据类型和编码获取当前类型和编码下的人员列表信息和其它类型数据信息,例如：组织
     *
     * @param httpCandidateDto
     * @return
     */
    ResponseResult getChildCandidate(HttpCandidateDto httpCandidateDto);

    /**
     * 根据角色名称分页查询角色列表
     * @param groupPageRequestDto
     * @return
     */
    ResponseResult getUserRolePageList(UserRolePageRequestDto groupPageRequestDto);

    /**
     * 根据用户组名称查询用户组列表
     * @param groupPageRequestDto
     * @return
     */
    ResponseResult getUserGroupPageList(UserGroupPageRequestDto groupPageRequestDto);

    /**
     * 根据任务实例Id和变量key，返回对应的value
     * @param
     * @return
     */
    ResponseResult getVarVal(VarValRequestDto varValRequestDto);

    /**
     * 根据岗位名称获取岗位数据列表
     * @param positionListRequestDto
     * @return
     */
    ResponseResult getUserPositionPageList(UserPositionPageRequestDto positionListRequestDto);

    /**
     * 操作流程实例(暂时支持流程实例暂停(挂起)或激活(解挂)操作)
     * @param httpProcessHandleDto
     * @return
     */
    ResponseResult handleProcessInstanceByAction(HttpProcessHandleDto httpProcessHandleDto);

    /**
     * 操作任务实例(暂时支持任务暂停(挂起)或激活(解挂)操作)
     * @param httpProcessHandleDto
     * @return
     */
    ResponseResult handleTaskByAction(HttpProcessHandleDto httpProcessHandleDto);


    /**
     * 人工选择后续节点，返回后续节点连接上的参数
     * @param httpBaseTaskDto
     * @return
     */
    ResponseResult getManualSelectNextNode(HttpBaseTaskDto httpBaseTaskDto);


    /**
     * 补发接口
     * @param httpSupplySignTaskVo
     * @return
     */
    ResponseResult supplySignTask(HttpSupplySignTaskVo httpSupplySignTaskVo);

    /**
     * 设置节点候选人
     * @param setNodeCandidateRequestDto
     * @return
     */
    ResponseResult setCandidateUsersForNode(SetNodeCandidateRequestDto setNodeCandidateRequestDto);

    /**
     * 清除预先设置的后续节点的候选人
     *
     * @param cleanNodeCandidateRequestDto
     * @return
     */
    ResponseResult cleanNodeCandidateUsers(CleanNodeCandidateRequestDto cleanNodeCandidateRequestDto);
    /**
     * 根据流程实例编号查询当前任务或已完成的最后一个任务节点编号
     * @param processInstanceId
     * @return
     */
    ResponseResult<TaskDTO> getCurrentOrDoneTaskIdByProcessInstanceId(String processInstanceId);

    /**
     * 根据流程实例ID和节点编码批量查询审批信息
     *
     * @param httpFlowRecordsQueryDto
     * @return 流转记录
     */
    ResponseResult batchQueryFlowRecords(HttpFlowRecordsQueryDto httpFlowRecordsQueryDto);

    /**
     * 获取某个流程模型下的任务节点列表
     * @param httpGetTaskDto
     * @return 流转记录
     */
    ResponseResult getTaskCodeList(HttpGetTaskDto httpGetTaskDto);


    /**
     * 更新待办中的【计划完成时间】
     *
     * @param httpUpdateCompTimeDto 工作项id等信息
     * @return 处理结果
     */
    ResponseResult updateTaskCompTime(HttpUpdateCompTimeDto httpUpdateCompTimeDto);

    /**
     * 查询指定当前在指定节点的流程集合
     * @param httpGetTaskDto
     * @return 流转记录
     */
    ResponseResult getRunningProcessList(HttpGetTaskDto httpGetTaskDto);

    /**
     * 根据流程实例编号查询当前任务节点id及判断节点是否为第一个节点
     * @param processInstanceId 流程实例id
     */
    ResponseResult getCurrentTaskInfoByProcessInstanceId(String processInstanceId);


    /**
     * 在流程实例中动态新增节点
     *
     * @param httpDynamicInjectTaskDto
     * @return
     */
    ResponseResult dynamicInjectTask(HttpDynamicInjectTaskDto httpDynamicInjectTaskDto);

    /**
     * 将流程实例迁移至流程最新版本
     *
     * @param httpMigrateProcessModelDto
     * @return
     */
    ResponseResult migrateToNewVersion(HttpMigrateProcessModelDto httpMigrateProcessModelDto);

    /**
     * 获取流程配置的事件
     * @param modelKey
     * @return
     */
    ResponseResult getConfigEvents( String modelKey);

    /**
     * 根据模型key查询待办任务信息
     * @param httpFlowQueryInfoDto
     * @return
     */
    ResponseResult getTodoTaskByModelKey(HttpFlowQueryInfoDto httpFlowQueryInfoDto);

    /**
     * 根据流程编码获取当前运行的流程实例的modelId
     * @param modelKey
     * @return
     */
    ResponseResult getModelInfoByModelKey( String modelKey);

    /**
     * 返回后续分支节点以及节点连接线上的参数
     * @param httpBaseTaskDto
     * @return
     */
    ResponseResult getNextNodes(HttpBaseTaskDto httpBaseTaskDto);


    /**
     * 批量同步待办任务至待办组件
     * @param httpTaskManagerBatchDto
     * @return
     */
    ResponseResult batchInsertToTasksManager(HttpTaskManagerBatchDto httpTaskManagerBatchDto);

    /**
     * 根据流程id，获取流程状态
     * @return
     */
    ResponseResult getFlowStateByFlowId(String flowId);



    /**
     * 修改流程节点审批人(运维工具)
     * @param modifyApproverVO
     * @return
     */
    ResponseResult updateNodeApprover(HttpModifyApproverVO modifyApproverVO);

}
